(function($, doc, win){ "use strict"; var Photobox, photoboxes=[], photobox, options, images=[], imageLinks, activeImage=-1, activeURL, lastActive, activeType, prevImage, nextImage, thumbsStripe, docElm, APControl, transitionend="transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd", isOldIE = !('placeholder' in doc.createElement('input')), noPointerEvents=(function(){ var el=$('

')[0]; el.style.cssText='pointer-events:auto'; return !el.style.pointerEvents})(), isMobile='ontouchend' in doc, thumbsContainerWidth, thumbsTotalWidth, activeThumb=$(), blankImg="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", transformOrigin=getPrefixed('transformOrigin'), transition=getPrefixed('transition'), preload={}, preloadPrev=new Image(), preloadNext=new Image(), closeBtn, image, video, prevBtn, nextBtn, thumbsToggler, caption, captionText, pbLoader, autoplayBtn, thumbs, wrapper, defaults={ single: false, beforeShow: null, afterClose: null, loop: true, thumb: null, thumbs: true, counter: "(A/B)", title: true, autoplay: false, time: 3000, history: true, hideFlash: true, zoomable: true, keys: { close: '27, 88, 67', prev: '37, 80', next: '39, 78' }}, overlay=$('

').append(thumbsToggler=$(''), pbLoader=$('
'), prevBtn=$('
').on('click', next_prev), nextBtn=$('
').on('click', next_prev), wrapper=$('
').append(image=$(''), video=$('
') ), closeBtn=$('
').on('click', close)[0], autoplayBtn=$('
').append($('
') ), caption=$('
').append('', captionText=$('
').append('
'), thumbs=$('
').addClass('pbThumbs') ) ); function prepareDOM(){ noPointerEvents&&overlay.hide(); autoplayBtn.off().on('click', APControl.toggle); thumbs.off().on('click', 'a', thumbsStripe.click); isOldIE&&overlay.addClass('msie'); isMobile&&overlay.addClass('mobile'); overlay.off().on('click', 'img', function(e){ e.stopPropagation(); }); $(doc.body).append(overlay); docElm=doc.documentElement; } $.fn.photobox=function(target, settings, callback){ return this.each(function(){ var o, pb, PB_data=$(this).data('_photobox'); if(PB_data){ if(target==='destroy') PB_data.destroy(); return this; } if(typeof target!='string') target='a'; if(target==='prepareDOM'){ prepareDOM(); return this; } o=$.extend({}, defaults, settings||{}); pb=new Photobox(o, this, target); $(this).data('_photobox', pb); pb.callback=callback; photoboxes.push(pb); }); } Photobox=function(_options, object, target){ this.options=$.extend({}, _options); this.target=target; this.selector=$(object||doc); this.thumbsList=null; var filtered=this.imageLinksFilter(this.selector.find(target)); this.imageLinks=filtered[0]; this.images=filtered[1]; this.init(); }; Photobox.prototype={ init:function(){ var that=this; if(this.options.thumbs){ this.thumbsList=thumbsStripe.generate.apply(this); } this.selector.on('click.photobox', this.target, function(e){ e.preventDefault(); that.open(this); }); this.observerTimeout=null; if(this.selector[0].nodeType==1) that.observeDOM(that.selector[0], function(){ clearTimeout(that.observerTimeout); that.observerTimeout=setTimeout(function(){ var filtered=that.imageLinksFilter(that.selector.find(that.target)), activeIndex=0; if(that.imageLinks.length==filtered[0].length) return; that.imageLinks=filtered[0]; that.images=filtered[1]; if(photobox){ if(that.selector==photobox.selector){ images=that.images; imageLinks=that.imageLinks; for(var i=images.length; i--;){ if(images[i][0]==activeURL) return; } overlay.removeClass('hasArrows'); }} if(that.options.thumbs){ that.thumbsList=thumbsStripe.generate.apply(that); thumbs.html(that.thumbsList); } if(that.images.length&&activeURL&&that.options.thumbs){ activeIndex=that.thumbsList.find('a[href="'+activeURL+'"]').eq(0).parent().index(); if(activeIndex==-1) activeIndex=0; updateIndexes(activeIndex); thumbsStripe.changeActive(activeIndex, 0); }}, 50); }); }, open:function(link){ var startImage=$.inArray(link, this.imageLinks); if(startImage==-1) return false; options=this.options; images=this.images; imageLinks=this.imageLinks; photobox=this; this.setup(1); overlay.on(transitionend, function(){ overlay.off(transitionend).addClass('on'); changeImage(startImage, true); }).addClass('show'); if(isOldIE) overlay.trigger('MSTransitionEnd'); return false; }, imageLinksFilter:function(obj){ var that=this, images=[], caption={}, captionlink; return [obj.filter(function(i){ var link=$(this), thumbImg; if(that.options.thumb) thumbImg=link.find(that.options.thumb)[0]; if(!that.options.thumb||!thumbImg) thumbImg=link.find('img')[0]; if(thumbImg) captionlink=thumbImg.getAttribute('data-pb-captionlink'); caption.content=(thumbImg.getAttribute('alt')||thumbImg.getAttribute('title')||''); if(captionlink){ captionlink=captionlink.split('['); if(captionlink.length==2){ caption.linkText=captionlink[0]; caption.linkHref=captionlink[1].slice(0,-1); }else{ caption.linkText=captionlink; caption.linkHref=captionlink; } caption.content +=' ' + caption.linkText + ''; } images.push([link[0].href, caption.content, thumbImg.getAttribute('src')]); return true; }), images]; }, observeDOM:(function(){ var MutationObserver=win.MutationObserver||win.WebKitMutationObserver, eventListenerSupported=win.addEventListener; return function(obj, callback){ if(MutationObserver){ var obs=new MutationObserver(function(mutations, observer){ if(mutations[0].addedNodes.length||mutations[0].removedNodes.length) callback(); }); obs.observe(obj, { childList:true, subtree:true }); } else if(eventListenerSupported){ obj.addEventListener('DOMNodeInserted', callback, false); obj.addEventListener('DOMNodeRemoved', callback, false); }} })(), setup:function (open){ var fn=open ? "on":"off"; image[0].src=blankImg; if(options.thumbs){ if(!isMobile){ thumbs[fn]('mouseenter.photobox', thumbsStripe.calc) [fn]('mousemove.photobox', thumbsStripe.move); }} if(open){ image.css({'transition':'0s'}).removeAttr('style'); overlay.show(); thumbs .html(this.thumbsList) .trigger('mouseenter.photobox'); if(options.thumbs){ overlay.addClass('thumbs'); }else{ thumbsToggler.prop('checked', false); overlay.removeClass('thumbs'); } if(this.images.length < 2||options.single) overlay.removeClass('thumbs hasArrows hasCounter hasAutoplay'); else{ overlay.addClass('hasArrows hasCounter') if(options.time > 1000){ overlay.addClass('hasAutoplay'); if(options.autoplay) APControl.progress.start(); else APControl.pause(); } else overlay.removeClass('hasAutoplay'); } options.hideFlash&&$('iframe, object, embed').css('visibility', 'hidden'); }else{ $(win).off('resize.photobox'); } $(doc).off("keydown.photobox")[fn]({ "keydown.photobox": keyDown }); if(isMobile){ overlay.removeClass('hasArrows'); wrapper[fn]('swipe', onSwipe); } if(options.zoomable){ overlay[fn]({"mousewheel.photobox": scrollZoom }); if(!isOldIE) thumbs[fn]({"mousewheel.photobox": thumbsResize }); } if(!options.single){ overlay[fn]({"mousewheel.photobox": wheelNextPrev }); }}, destroy:function(){ options=this.options; this.selector .off('click.photobox', this.target) .removeData('_photobox'); close(); }} function onSwipe(e, Dx, Dy){ if(Dx==1){ image.css({transform:'translateX(25%)', transition:'.2s', opacity:0}); setTimeout(function(){ changeImage(prevImage) }, 200); } else if(Dx==-1){ image.css({transform:'translateX(-25%)', transition:'.2s', opacity:0}); setTimeout(function(){ changeImage(nextImage) }, 200); } if(Dy==1) thumbsToggler.prop('checked', true); else if(Dy==-1) thumbsToggler.prop('checked', false); } thumbsStripe=(function(){ var containerWidth=0, scrollWidth=0, posFromLeft=0, stripePos=0, animated=null, padding, el, $el, ratio, scrollPos, pos; return{ generate:function(){ var thumbsList=$('